public class BitOperatorTest {
    public static void main(String[] args) {
        System.out.println(5 << 2);//20
        /*
        实际运算符规则：
            5的二进制补码： 00000000 00000000 00000000 00000101
            5<<2         00000000 00000000 00000000 00010100 （左移2位，右边补2个0）
                      把00000000 00000000 00000000 00010100 粘到计算器中就可以看到结果

         快速口诀：左移几位，相当于乘以2的几次方
             5<<2 =  5 * 2的2次 = 5 * 4 = 20
         */

        System.out.println(-5 << 2);
        /*
        快速口诀：左移几位，相当于乘以2的几次方
            -5<<2 =  -5 * 2的2次 = -5 * 4 = -20
         实际运算符规则：
            -5的二进制：11111111 11111111 11111111 11111011（补码）
            -5<<2     11111111 11111111 11111111 11101100
                计算器算： 11111111 11111111 11111111 11101100粘到计算器中
                人工算：换回原码
                        11111111 11111111 11111111 11101100 补码
                        11111111 11111111 11111111 11101011 反码
                        10000000 00000000 00000000 00010100 原码
                        -                             16+4=20
            复习：
                -5的原码 10000000 00000000 00000000 00000101
                -5的反码：11111111 11111111 11111111 11111010
                -5的补码：11111111 11111111 11111111 11111011
         */

        System.out.println("=================================");
        System.out.println(40 >> 2);
        /*
        快速口诀：   右移几位，相当于除以2的几次方
            40 >> 2 = 40 / 2的2次 = 40 / 4 = 10

         实际运算：
            40的补码：00000000  00000000 00000000 00101000
            40>>2   00000000 00000000 00000000 00001010 （原来最高位是0，左边继续补0）
                   用计算器：直接把 00000000 00000000 00000000 00001010
                   人工算：                                      8 +2 = 10
         */

        System.out.println(-40 >> 4);
        /*
        快速口诀：   右移几位，相当于除以2的几次方
            -40 >> 4 = -40 / 2的4次 = -40 / 16 = -3 （向下取整）
        实际运算：
            -40的补码：11111111111111111111111111011000
            -40>>4：  11111111111111111111111111111101（原来最高位是1，左边继续补1）
                用计算器：11111111111111111111111111111101 粘到计算器中
                人工算：
                        11111111111111111111111111111101 补码
                        11111111111111111111111111111100 反码
                        10000000000000000000000000000011 原码
                        -                             2+1=-3

         */

        System.out.println("========================================");
        System.out.println(40 >>> 2);//10  等价于 40>>2
        System.out.println(-40 >>> 4);//268435453
        /*
        实际运算：
            -40的补码：11111111111111111111111111011000
            -40>>>4： 00001111111111111111111111111101
                最高位是0，是正数，此时补码就是原码

         */

        System.out.println("========================================");

        System.out.println( 5 & 3);//1
        /*
        5的二进制补码：00000000 00000000 00000000 00000101
        3的二进制补码：00000000 00000000 00000000 00000011
        &---------------------------------------------------
                    00000000 00000000 00000000 00000001
         */

        System.out.println("========================================");

        System.out.println( 5 | 3);//7
        /*
        5的二进制补码：00000000 00000000 00000000 00000101
        3的二进制补码：00000000 00000000 00000000 00000011
        |---------------------------------------------------
                    00000000 00000000 00000000 00000111
         */

        System.out.println("========================================");

        System.out.println( 5 ^ 3);//6
        /*
        5的二进制补码：00000000 00000000 00000000 00000101
        3的二进制补码：00000000 00000000 00000000 00000011
        ^---------------------------------------------------
                    00000000 00000000 00000000 00000110
         */

        System.out.println("========================================");
        System.out.println(~5);//-6
        /*
        5的二进制补码：00000000 00000000 00000000 00000101
        ~5：         11111111 11111111 11111111 11111010
                得到的是 补码 11111111 11111111 11111111 11111010
                用计算器，直接粘贴 11111111 11111111 11111111 11111010
                人工算：
                    11111111 11111111 11111111 11111010 补码
                    11111111 11111111 11111111 11111001 反码
                    10000000 00000000 00000000 00000110 原码 -6
         */
    }
}
